#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <map>
#include <climits>
#include <unordered_map>
using namespace std;

int main(){
    int n;
    cin >>n;
    
    unordered_map<int, int> mp;
    while(n--)
    {
        int index=-1;
        int a[6]={0};
        for(int i=0;i<6;i++){
            cin >>a[i];
            if(a[i]==1)
                index=i;
        }
        int val=0;
        
        if(index&1){ //奇数, 下，右，后时
            val=1000*a[(index+4)%6]+100*a[(index+2)%6]+10*a[(index+3)%6]+a[(index+1)%6];
        }else{
            val=1000*a[(index+2)%6]+100*a[(index+4)%6]+10*a[(index+3)%6]+a[(index+5)%6];
        }
       for(int j=0,tmp=val;j<3;j++){
           tmp=tmp/10+((tmp%10)*1000);
           val=min(val,tmp);
       }
        mp[val]++;
    }
    vector<int> res;
    for(auto it:mp) res.push_back(it.second);
    sort(res.begin(),res.end(),greater<int>());
    cout << res.size() <<endl;
    for(int i=0;i<res.size();i++){
        cout<< res[i]<<" ";
    }cout <<endl;
    
    return 0;
}